/*
 * TeleStax, Open Source Cloud Communications  Copyright 2012.
 * and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.mobicents.protocols.ss7.tools.simulator.level2;

import javolution.xml.XMLFormat;
import javolution.xml.stream.XMLStreamException;

import org.mobicents.protocols.ss7.indicator.NatureOfAddress;
import org.mobicents.protocols.ss7.indicator.NumberingPlan;

/**
 * 
 * @author sergey vetyutnev
 * 
 */
public class SccpConfigurationData {

	protected static final String REMOTE_ON_GT_MODE = "routeOnGtMode";
	protected static final String REMOTE_SPC = "remoteSpc";
	protected static final String LOCAL_SPC = "localSpc";
	protected static final String NI = "ni";
	protected static final String REMOTE_SSN = "remoteSsn";
	protected static final String LOCAL_SSN = "localSsn";
	protected static final String GLOBAL_TITLE_TYPE = "globalTitleType";
	protected static final String ADDRESS_NATURE = "addressNature";
	protected static final String NUMBERING_PLAN = "numberingPlan";
	protected static final String TRANSLATION_TYTE = "translationType";
	protected static final String CALLING_PARTY_ADDRESS_DIGITS = "callingPartyAddressDigits";

	private boolean routeOnGtMode;
	private int remoteSpc = 0;
	private int localSpc = 0;
	private int localSsn;
	private int remoteSsn;
	private int ni = 0;
	private GlobalTitleType globalTitleType = new GlobalTitleType(GlobalTitleType.VAL_TT_NP_ES_NOA);
	private NatureOfAddress natureOfAddress = NatureOfAddress.INTERNATIONAL;
	private NumberingPlan numberingPlan = NumberingPlan.ISDN_MOBILE;
	private int translationType = 0;
	private String callingPartyAddressDigits = "";

	public boolean isRouteOnGtMode() {
		return routeOnGtMode;
	}

	public void setRouteOnGtMode(boolean routeOnGtMode) {
		this.routeOnGtMode = routeOnGtMode;
	}

	public int getRemoteSpc() {
		return remoteSpc;
	}

	public void setRemoteSpc(int remoteSpc) {
		this.remoteSpc = remoteSpc;
	}

	public int getLocalSpc() {
		return localSpc;
	}

	public void setLocalSpc(int localSpc) {
		this.localSpc = localSpc;
	}

	public int getLocalSsn() {
		return localSsn;
	}

	public void setLocalSsn(int localSsn) {
		this.localSsn = localSsn;
	}

	public int getRemoteSsn() {
		return remoteSsn;
	}

	public void setRemoteSsn(int remoteSsn) {
		this.remoteSsn = remoteSsn;
	}

	public int getNi() {
		return ni;
	}

	public void setNi(int ni) {
		this.ni = ni;
	}

	public GlobalTitleType getGlobalTitleType() {
		return globalTitleType;
	}

	public void setGlobalTitleType(GlobalTitleType globalTitleType) {
		this.globalTitleType = globalTitleType;
	}

	public NatureOfAddress getNatureOfAddress() {
		return natureOfAddress;
	}

	public void setNatureOfAddress(NatureOfAddress natureOfAddress) {
		this.natureOfAddress = natureOfAddress;
	}

	public NumberingPlan getNumberingPlan() {
		return numberingPlan;
	}

	public void setNumberingPlan(NumberingPlan numberingPlan) {
		this.numberingPlan = numberingPlan;
	}

	public int getTranslationType() {
		return translationType;
	}

	public void setTranslationType(int translationType) {
		this.translationType = translationType;
	}

	public String getCallingPartyAddressDigits() {
		return callingPartyAddressDigits;
	}

	public void setCallingPartyAddressDigits(String callingPartyAddressDigits) {
		this.callingPartyAddressDigits = callingPartyAddressDigits;
	}

	protected static final XMLFormat<SccpConfigurationData> XML = new XMLFormat<SccpConfigurationData>(SccpConfigurationData.class) {

		public void write(SccpConfigurationData sccp, OutputElement xml) throws XMLStreamException {
			xml.setAttribute(REMOTE_ON_GT_MODE, sccp.isRouteOnGtMode());
			xml.setAttribute(REMOTE_SPC, sccp.getRemoteSpc());
			xml.setAttribute(LOCAL_SPC, sccp.getLocalSpc());
			xml.setAttribute(NI, sccp.getNi());
			xml.setAttribute(REMOTE_SSN, sccp.getRemoteSsn());
			xml.setAttribute(LOCAL_SSN, sccp.getLocalSsn());
			xml.setAttribute(TRANSLATION_TYTE, sccp.getTranslationType());

			xml.add(sccp.getGlobalTitleType().toString(), GLOBAL_TITLE_TYPE, String.class);
			xml.add(sccp.getNatureOfAddress().toString(), ADDRESS_NATURE, String.class);
			xml.add(sccp.getNumberingPlan().toString(), NUMBERING_PLAN, String.class);
			xml.add(sccp.getCallingPartyAddressDigits(), CALLING_PARTY_ADDRESS_DIGITS, String.class);
		}

		public void read(InputElement xml, SccpConfigurationData sccp) throws XMLStreamException {
			sccp.setRouteOnGtMode(xml.getAttribute(REMOTE_ON_GT_MODE).toBoolean());
			sccp.setRemoteSpc(xml.getAttribute(REMOTE_SPC).toInt());
			sccp.setLocalSpc(xml.getAttribute(LOCAL_SPC).toInt());
			sccp.setNi(xml.getAttribute(NI).toInt());
			sccp.setRemoteSsn(xml.getAttribute(REMOTE_SSN).toInt());
			sccp.setLocalSsn(xml.getAttribute(LOCAL_SSN).toInt());
			sccp.setTranslationType(xml.getAttribute(TRANSLATION_TYTE).toInt());

			String gtt = (String) xml.get(GLOBAL_TITLE_TYPE, String.class);
			sccp.setGlobalTitleType(GlobalTitleType.createInstance(gtt));
			String an = (String) xml.get(ADDRESS_NATURE, String.class);
			sccp.setNatureOfAddress(NatureOfAddress.valueOf(an));
			String np = (String) xml.get(NUMBERING_PLAN, String.class);
			sccp.setNumberingPlan(NumberingPlan.valueOf(np));
			sccp.setCallingPartyAddressDigits((String) xml.get(CALLING_PARTY_ADDRESS_DIGITS, String.class));
		}
	};

}
